package com.ruoyi.system.utils;

import com.ruoyi.system.domain.DifyAppInfo;
import com.ruoyi.system.domain.DifySiteInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.util.Optional;

/**
 * 调用 Dify 服务端 API 的工具类
 */
public final class DifyApiUtil {

    private static final Logger log = LoggerFactory.getLogger(DifyApiUtil.class);
    private static final RestTemplate restTemplate = new RestTemplate();

    private static final String INFO_ENDPOINT = "/info";
    private static final String SITE_ENDPOINT = "/site";

    /**
     * 工具类不应被实例化
     */
    private DifyApiUtil() {}

    /**
     * 调用 /info 接口获取应用基本信息
     * @param baseUrl Dify API 的基础 URL, 例如 "https://dify.htzl.com.cn:20000/v1"
     * @param apiKey 从前端传入的 API Key
     * @return 包含 DifyAppInfo 的 Optional 对象，如果调用失败则为空
     */
    public static Optional<DifyAppInfo> getAppInfo(String baseUrl, String apiKey) {
        String url = baseUrl + INFO_ENDPOINT;
        return callDifyApi(url, apiKey, DifyAppInfo.class);
    }

    /**
     * 调用 /site 接口获取应用站点信息
     * @param baseUrl Dify API 的基础 URL, 例如 "https://dify.htzl.com.cn:20000/v1"
     * @param apiKey 从前端传入的 API Key
     * @return 包含 DifySiteInfo 的 Optional 对象，如果调用失败则为空
     */
    public static Optional<DifySiteInfo> getSiteInfo(String baseUrl, String apiKey) {
        String url = baseUrl + SITE_ENDPOINT;
        return callDifyApi(url, apiKey, DifySiteInfo.class);
    }

    /**
     * 通用的 Dify API 调用模板方法
     * @param url 完整的请求 URL
     * @param apiKey API Key
     * @param responseType 期望返回的 Java 类型
     * @param <T> 泛型类型
     * @return 包含响应对象的 Optional，失败则为空
     */
    private static <T> Optional<T> callDifyApi(String url, String apiKey, Class<T> responseType) {
        HttpHeaders headers = new HttpHeaders();
        // 设置认证头
        headers.setBearerAuth(apiKey);
        HttpEntity<String> entity = new HttpEntity<>(headers);

        try {
            log.debug("向 Dify 发起请求: URL={}", url);
            ResponseEntity<T> response = restTemplate.exchange(url, HttpMethod.GET, entity, responseType);
            log.debug("成功从 Dify 获取响应: Status={}", response.getStatusCode());
            log.debug("响应结果:{}",response.getBody());
            return Optional.ofNullable(response.getBody());
        } catch (HttpClientErrorException e) {
            // 捕获 4xx 和 5xx 的错误，例如 401 Unauthorized
            log.error("调用 Dify API 失败 ({}): URL={}, 状态码={}, 响应体={}",
                    e.getStatusText(), url, e.getStatusCode(), e.getResponseBodyAsString());
        } catch (RestClientException e) {
            // 捕获网络连接等其他错误
            log.error("调用 Dify API 时发生网络或客户端异常: URL={}, 错误信息={}", url, e.getMessage());
        }

        return Optional.empty();
    }
}
